let mydb = require('./mydb');
let G = require('./config');
let path = require('path');

let randomUuid = require('./random_uuid');
let md5utils = require('./md5');

let dblogic = {};


//TODO
// init db
dblogic.initDb = async function () {
    // 先启动数据库
    mydb.initDb(path.join(__dirname, 'my_file'));

    let tableSql1 = mydb.buildTableSql(G.Table_User)
        .primaryKey('uuid', 'text')
        .keys(['uname text', 'pwd text', 'key text', 'utime long'])
        .sql();
    await mydb.createTable(tableSql1);

    let tableSql2 = mydb.buildTableSql(G.Table_Info)
        .autoPrimaryKey()
        .keys(['uname text', 'pwd text', 'email text', 'desc text', 'utime long', 'uuid text'])
        .sql();
    await mydb.createTable(tableSql2);
};


// close db
// login
dblogic.login = async function (uname, pwd) {
    let querySql = mydb.buildQuerySql(G.Table_User)
        .where(`uname="${uname}" and pwd="${pwd}"`)
        .sql();
    return await mydb.queryItem(querySql);
};


dblogic.getInfos = function (uuid) {
    let querySql = mydb.buildQuerySql(G.Table_Info)
        .where(`uuid="${uuid}"`)
        .sql();
    return mydb.queryAll(querySql);
};

dblogic.newInfo = async function (data) {
    let insertSql = mydb.buildInsertSql(G.Table_Info)
        .values({
            uname: data.uname,
            pwd: G.encrypt(data.pwd, data.key),
            email: data.email,
            desc: data.desc,
            uuid: data.uuid,
            utime: Date.now()
        }).sql();
    await mydb.insert(insertSql);
    let newInsertRowId = await mydb.getLastInsertRowId();
    if (newInsertRowId >= 0) {
        let querySql = mydb.buildQuerySql(G.Table_Info).where(`_kid=${newInsertRowId}`).sql();
        return await mydb.queryItem(querySql);
    }
    return null;
};


dblogic.newUser = async function (data) {
    // 1.检查用户名是否存在
    let querySql = mydb.buildQuerySql(G.Table_User)
        .where(`uname="${data.uname}"`)
        .sql();
    let row = await mydb.queryItem(querySql);
    if (row) {
        return false;
    } else {
        let uuid = randomUuid.uuid();
        data.uuid = uuid;

        // 插入
        let insertSql = mydb.buildInsertSql(G.Table_User)
            .values({
                uname: data.uname,
                pwd: data.pwd,
                utime: Date.now(),
                key: data.key,
                uuid: data.uuid
            })
            .sql();
        await mydb.insert(insertSql);
        return true;
    }
};

dblogic.deleteInfo = function (data, success) {
    let deleteSql = mydb.buildDeleteSql(G.Table_Info)
        .where(`${mydb.defaultPrimaryKeyId}="${data.kid}"`)
        .sql();
    G.log('deleteSql:', deleteSql);
    return mydb.delete(deleteSql);
};

// dblogic.isValidKey = function(data,success,fail){
//     let key = md5utils.hex_md5(data.key);
//     let querySql = mydb.buildQuerySql(G.Table_User)
//         .where(`uuid="${data.uuid}" and key = "${key}"`)
//         .sql();
//     mydb.queryItem(querySql,function (row) {
//         if(row){
//             if(success){
//                 success();
//             }
//         }else{
//             if(fail){
//                 fail();
//             }
//         }
//     });
// };

// dblogic.checkKey = function(data,success,fail){
//     let querySql = mydb.buildQuerySql(G.Table_User)
//         .where(`uuid="${data.uuid}"`)
//         .sql();
//     mydb.query(querySql,function (rows) {
//         if(rows.length > 0){
//             let key = rows[0].key;
//             if(key === md5utils.hex_md5(data.key)){
//                 if(success){
//                     success(G.decrypt(data.pwd,data.key));
//                 }
//             }else{
//                 if(fail){
//                     fail();
//                 }
//             }
//         }
//     });
// };


module.exports = dblogic;
